06. 编写阶段统计信息
编写阶段统计信息
在对强化学习解决方案进行迭代时,有必要衡量智能体的效果。最简单的跟踪指标是在每个阶段获取的总奖励(正如在示例智能体中所演示的那样)。
将这些(以及其他)统计信息保存到文件中会有帮助,以供以后分析。例如,阶段奖励逐渐增加表明智能体在学习。
一种方法是使用 Pandas 将阶段统计信息记录到 CSV 文件中。首先,在智能体的
__init__()
方法中初始化一些变量:
import os
import pandas as pd
from quad_controller_rl import util
class MyAgent(BaseAgent):
...
def __init__(self, task):
...
# Save episode stats
self.stats_filename = os.path.join(
util.get_param('out'),
"stats_{}.csv".format(util.get_timestamp())) # path to CSV file
self.stats_columns = ['episode', 'total_reward'] # specify columns to save
self.episode_num = 1
print("Saving stats {} to {}".format(self.stats_columns, self.stats_filename)) # [debug]
这里,我们可以使用实用函数
util.get_param('out')
获取目标输出目录。默认目录是
quad_controller_rl/out/
,但是你在调用
roslaunch
时可以自己指定目录:
roslaunch quad_controller_rl rl_controller.launch out:=<complete path>
然后定义一个辅助函数来写入 CSV 文件:
def write_stats(self, stats):
"""Write single episode stats to CSV file."""
df_stats = pd.DataFrame([stats], columns=self.stats_columns) # single-row dataframe
df_stats.to_csv(self.stats_filename, mode='a', index=False,
header=not os.path.isfile(self.stats_filename)) # write header first time only
然后在每个阶段结束时从
step()
调用它:
...
if done:
# Write episode stats
self.write_stats([self.episode_num, self.total_reward])
self.episode_num += 1
绘制阶段统计信息
运行完毕后(你可以随时在终端内按下
Ctrl+C
键结束运行),可以轻松地将 CSV 文件加载到 Pandas 中进行绘制。
import pandas as pd
df_stats = pd.read_csv(<CSV filename>)
df_stats[['total_reward']].plot(title="Episode Rewards")
提示 :如果你位于 catkin 工作区 (
~/catkin_ws/),运行devel/setup.bash以将项目代码包含在当前PYTHONPATH中。然后,你可以从该项目中导入模块,例如,util.py中有一个便利函数可以用来绘制阶段奖励(或者 CSV 文件中的任何统计信息):from quad_controller_rl import util util.plot_stats(<CSV filename>, title="Episode Rewards")